10. 1. 网络通信概述

- 网络通信起源
    - 起源于战争,服务于军事
    - 计算机之间相互传递信息
- 网络协议-七层协议
    - 协议: 保证相互通信的一套规章制度,操作,或者流程
    - 分层:每一层按照协议做自己的事情,然后把结果向邻居层次介绍
    - 七层:学术模型
        - 应用层
        - 表示层
        - 会话层
        - 网络层
        - 数据链路层
        - 物理层
    - 实际使用是四层协议
- 协议族:一组功能相似的协议 
- TCP/IP协议族
    - TCP(TransmissionControlProtocal)
        - 基于链接的,每次传输数据都要建立链接
        - 建立链接需要消耗资源,带宽等,需要消耗时间
        - 传输数据安全,可靠,数据传输有序
    - UDP(UserDatagramProtocal)
        - 无连接
        - 安全性差,数据接受无顺序
        - 传输消耗带宽小,没有专门链接需要消耗资源

# 2. socket编程
- socket:套接字,在网络里边,通过ip地址和端口进行通信的一种机制
- IP地址:用于在互联网上唯一表示一台机器的一个由数字构成的串,由四个字段构成
    - IPv4, IPv6
    
        比如: 192.168.1.1, 26.34.123.87
- 端口: 进行应用程序身份鉴定的一个数字
    - 65535以下都可以
    - 一般1000以下不推荐开发者自行使用
- TCP/UDP编程
    - UDP编程
        - 无连接
        - 客户端(Client) 和 服务器端(Server)
        - Server端流程
            1. 建立socket,socket是负责具体通信的一个实例
            2. 绑定,为创建的socket指派固定的端口和ip地址
            3. 接受对方发送内容
            4. 给对方发送反馈,此步骤为非必须步骤
        - Client端流程
            1. 建立通信的socket
            2. 发送内容到指定服务器
            3. 接受服务器给定的反馈内容
        - 案例01是服务器,02是客户端
        - 需要注意的是,发送的消息是经过编码处理后的,即只能发送bytes
            - 要想得到bytes格式的信息,需要用到str.encode
            - 如果有bytes格式信息,想得到字符串,需要用到bytes.decode
        - 服务器程序要求永久运行,需要用死循环实现
            - 参见案例03
    - TCP编程
        - 面向链接的传输,即每次传输之前需要先建立一个链接
        - 客户端和服务器端两个程序需要编写
        - Server端的编写流程
            1. 建立socket负责具体通信,这个socket其实只负责接受对方的请求,真正通信的是链接后从新建立的socket
            2. 绑定端口和地址
            3. 监听接入的访问socket
            4. 接受访问的socket,可以理解接受访问即建立了一个通讯的链接通路
            5. 接受对方的发送内容,利用接收到的socket接收内容
            6. 如果有必要,给对方发送反馈信息
            7. 关闭链接通路
            8. 参看案例04
        - Client端流程
            1. 建立通信socket
            2. 链接对方,请求跟对方建立通路
            3. 发送内容到对方服务器
            4. 接受对方的反馈
            5. 关闭链接通路
            6. 参看案例05
# 3. FTP编程
- FTP(FileTransferProtocal)文件传输协议
- 用途:定制一些特殊的上传下载文件的服务
- 用户分类,登录FTP服务器必须有一个账户
    1. Real账户:注册账户
    2. Guest账户:可能是临时的对某一类人的行为进行允许
    3. Anonymous账户:匿名账户,允许任何人
- FTP工作流程
![](img/ftp01.png)
    1. 客户端链接远程主机上的FTP服务器
    2. 客户端输入用户名和密码(或者“anonymous”和电子邮件地址)
    3. 客户端和服务器进行各种文件传输和信息查询操作
    4. 客户端从远程FTP服务器退出,结束传输
- FTP文件表示
    - 分三段表示FTP服务器上的文件
    - HOST:主机地址,类似于 ftp.mozilla.org, 以ftp开头
    - DIR:目录, 表示文件所在本地的路径,例如 pub/android/focus/1.1-RC1/ 
    - File: 文件名称, 例如 Klar-1.1-RC1.apk
    - 如果想完整精确表示ftp上某一个文件,需要上述三部分组合在一起
- 案例06
# 4. 邮件客户端
## 电子邮件的历史
- 起源
    - 1969 Leonard K. 教授发给同事的 “LO”
    - 1971 美国国防部资助的阿帕网(Arpanet)的通讯机制
    - 通讯地址里用@(读作艾特),是因为这个符号比较生僻,不会出现在正常的名称中
    - 1987年中国第一封电子邮件,
    “Across the Great Wall we can reach every corner in the world"
- 管理程序
    - Euroda使邮件飞入寻常百姓家
    - Netscape和Outlook,Foxmail后来居上
    - Hotmail使用浏览器收发邮件
- 参考资料
    - [官网](https://docs.python.org/3/library/email.mime.html)
    
## 邮件工作流程
- laoshi@qq.com, 老师,北京海淀
- xuesheng@sina.com, 学生,上海江岸区
- MUA(MailUserAgent)邮件用户代理
- MTA(MailTransferAgent)用户传输代理
- MDA(MailDeliveryAgent)邮件投递代理
- 流程
    1. MUA->MTA, 邮件已经在服务器上了
    2. qq MTA->.........->sina MTA, 邮件在新浪的服务器上
    3. sina MTA-> sina MDA, 此时邮件已经在你的邮箱里了
    4. sina MDA -> MUA(Foxmail/Outlook), 邮件下载到本地电脑
    
- 编写程序过程
    1. 发送: MUA->MTA with SMTP:SimpleMailTransferProtocal,包含MTA->MTA
    2. 接受: MDA->MUA with POP3 and IMAP:PostOfficeProtocal v3 and InternetMessageAccessProtocal v4
- 准备工作
    - 注册邮箱(以qq邮箱为例)  
    - 第三方邮箱需要特殊设置,以qq邮箱为例
        - 进入设置中心
        - 取得授权码
- Python for mail
    - SMTP:负责发送邮件
        1. email:构造邮件
            - 纯文本邮件(案例07)
                - 直接把邮件内容写入就好
            - HTML格式邮件(案例08)
                - 准备HTML代码作为邮件内容
                - 把邮件是subtype修改为html
            - 带附件的邮件(案例09)
                - 看做是一个文本邮件和一个附件的合体
                - 一封邮件如果涉及到多个部分,需要使用MIMEMultipart格式构建
                - 添加一个MIMEText正文
                - 添加一个MIMEBase或者MEMEText作为附件
            - 添加邮件头,抄送等信息(案例10)
                - 王大鹏<1366798119@qq.com>, 如果想让对方看到这种格式的邮件发送,需要用Header构建邮件头
                - 同时,所有字符串形式的内容都需要编码
                - mail["From"], 表示的是发送者信息,包括姓名和邮件地址
                - mail['To'], 表示接受者信息,包括姓名和地址邮件
                - mail['Subject'], 表示摘要或者主题信息
            - 同时支持HTML/Text格式(案例11)
                - 构建一个MIMEMultipart格式邮件
                - MIMEMultipart邮件subtype为alternative格式
                - HTML和Text个添加一个邮件
        2. smtplib:发送邮件
    - POP3(接受邮件)
        - 本质上是MDA到MUA的一个过程
        - 从 MDA下载下来的是一个完整的邮件结构体,需要解析才能得到每个具体可读的内容
        - 步骤:
            1. 用poplib下载邮件结构体原始内容
                1. 准备相应的内容(邮件地址,密码,POP3实例)
                2. 身份认证
                3. 一般会先得到邮箱内邮件的整体列表
                4. 根据相应序号,得到某一封信的数据流
                5. 利用解析函数进行解析出相应的邮件结构体
            2. 用email解析邮件的具体内容
        - 案例12